//负责人：组长，产品经理
// 管理逻辑类
package com.java.datamanage;
import com.java.model.Admin;
import com.java.model.Student;

import java.util.ArrayList;
<<<<<<< HEAD
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
=======
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
>>>>>>> 1985484ee1452c7d22a8520a807bdae2011c4a07

public class StudentManageSystem {
    private static final Logger LOGGER = Logger.getLogger(StudentManageSystem.class.getName());
    //存储系统中所有学生信息的列表
    private List<Student> students;
    //存储系统管理员信息的对象
    private Admin admin;
    private List<Admin> admins = new ArrayList<>();

    //构造函数，在创建 StudentManageSystem 对象时自动加载数据。
    public StudentManageSystem() {
        loadData();
    }


    /*从文件中加载学生和管理员数据。
    如果没有加载到管理员数据，则创建一个默认的管理员并保存。*/
    private void loadData() {
        students = FileDataManager.loadStudents();
        if (students==null) {
            students = new ArrayList<>();
        }else {
            // 移除列表中的 null 元素
            students.removeIf(student -> student == null);
            // 输出加载的学生数量
            LOGGER.log(Level.INFO, "加载的学生数量: {0}", students.size());
        }

        admin = FileDataManager.loadAdmin();
        if (admin == null) {
            // 创建默认管理员对象 账号:admin 密码:admin123
            admin = new Admin("admin", "admin123");
            saveAdmin();
        }
    }

    //将学生数据保存到文件中
    private void saveData() {
        FileDataManager.saveStudents(students);
    }

    //将管理员数据保存到文件中
    private void saveAdmin() {
        FileDataManager.saveAdmin(admin);
    }

    /*----学生管理主要逻辑(增删改查)----*/

    //增加学生
    public void addStudent(Student student) {
        if (student != null) {
            students.add(student);
            saveData();
        }
    }

<<<<<<< HEAD
    //更新学会信息
=======
    //更新学生信息
>>>>>>> 1985484ee1452c7d22a8520a807bdae2011c4a07
    public void updateStudent(Student updatedStudent) {
        for(int i=0;i<students.size();i++){
            //根据id找到学生
            if(students.get(i).getId().equals(updatedStudent.getId())){
                students.set(i,updatedStudent);
                saveData();
                break;
            }
        }
    }

    //按照学号删除学生信息
    public void deleteStudent(String studentId) {
        //创建一个临时列表储存需要删除的学生
        List<Student> studentsToRemove=new ArrayList<>();
        //遍历学生列表找到需要删除的学生
        for(Student student:students){
            if(student.getId().equals(studentId)){
                studentsToRemove.add(student);
            }
        }
        students.removeAll(studentsToRemove);
        saveData();
    }

    //获取所有学生
    public List<Student> getAllStudents() {
        return students;
    }

    //按学号查询学生信息
    public Student getStudentById(String id) {
        //遍历学生列表，找到对应的id的学生
        for(Student student:students){
            if(student.getId().equals(id)){
                return student;
            }
        }
        return null;
    }

    /*----成绩管理主要逻辑（增删）----*/

    //增加和修改对应课程成绩
    public void addOrUpdateGrade(String studentId, String courseName, double grade) {
       Student student=getStudentById(studentId);
       if(student!=null){
           student.addOrUpdateCourseGrade(courseName, grade);
           saveData();
       }
    }

    //删除对应课程成绩
    public void removeGrade(String studentId, String courseName) {
        Student student = getStudentById(studentId);
        if (student != null) {
            student.removeCourseGrade(courseName);
            saveData();
        }
    }

<<<<<<< HEAD
    /**
=======
    /**（负责人：监督官）
>>>>>>> 1985484ee1452c7d22a8520a807bdae2011c4a07
     * 用集合储存学生和管理员信息，通过姓名查找，判断账号是否存在
     * 不论是管理员还是学生都可以查找
     */
    // 检查账号是否已存在（无论管理员还是学生）
    public boolean isUsernameExists(String username) {
        // 检查管理员中是否有该账号
        for (Admin admin : admins) {
            if (Objects.equals(admin.getUsername(), username)) {
                return true;
            }
        }
        // 检查学生中是否有该账号
        for (Student student : students) {
            if (student != null && Objects.equals(student.getName(), username)) {
                return true;
            }
        }
        return false; // 账号不存在
    }

<<<<<<< HEAD

=======
>>>>>>> 1985484ee1452c7d22a8520a807bdae2011c4a07
    // 管理员验证
    /**
     * 验证管理员的用户名和密码。
     * 目前方法总是返回 false，需要实现具体的验证逻辑。
     * @param username 管理员用户名
     * @param password 管理员密码
     *  如果验证通过返回 true，否则返回 false
     */
    public boolean authenticate(String username, String password) {
<<<<<<< HEAD


        return false;
=======
        return admin.getUsername().equals(username) && admin.getPassword().equals(password);
>>>>>>> 1985484ee1452c7d22a8520a807bdae2011c4a07
    }

    // 更新管理员信息
    /**
     * 更新管理员的姓名和密码。
     * 目前方法体为空，需要实现具体的更新逻辑。
<<<<<<< HEAD
     * @param fullName 管理员的新姓名
     * @param newPassword 管理员的新密码
     */
    public void updateAdminInfo(String fullName, String newPassword) {

=======
     * @param newPassword 管理员的新密码
     */
    public void updateAdminInfo(String newPassword) {
        admin.setPassword(newPassword);
        saveAdmin();
>>>>>>> 1985484ee1452c7d22a8520a807bdae2011c4a07
    }
    /**
     * 获取系统中所有课程的名称集合。
     * 目前方法总是返回 null，需要实现具体的查询逻辑。
     * @return 包含所有课程名称的集合，如果没有课程则返回 null
     */
    public Set<String> getAllCourses() {
<<<<<<< HEAD


       return null;
=======
        Set<String> courses = new HashSet<>();
        for (Student student : students) {
            courses.addAll(student.getScores().keySet());
        }
        return courses;
>>>>>>> 1985484ee1452c7d22a8520a807bdae2011c4a07
    }

    // 获取管理员信息
    /**
     * 获取系统管理员的信息。
     * @return 管理员对象
     */
    // 获取管理员信息
    public Admin getAdmin() {
        return admin;
    }

}